/**
 * JFAuthentification.java    01/02/2012
 */

package l3.info.Projet.Client;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import l3.info.Projet.Utilitaires.Configuration;
import l3.info.Projet.Utilitaires.Chiffrement;

/**
 * Fenêtre de connexion de l'application
 * @author Loic Martinez
 * @version 1.0
 */

public class JFAuthentification extends JFrame implements ActionListener {

	private static final String TITRE = "Identification";
	private static final int LARGEUR = 290;
	private static final int HAUTEUR = 290;
	private static final int ABSCISSE = 500;
	private static final int ORDONNEE = 200;
	private static final String ID = "Identifiant";
	private static final String MDP = "Mot de passe";
	private static final String CNX = "Connexion";
	private static final String QUITTER = "Quitter";

	private JLabel labelId, labelMdp;
	private JTextField fieldId;
	private JPasswordField fieldMdp;
	private JButton boutonConnexion, boutonQuitter;
	private JPanel firstPan, panImage, pan, panBouton;
	private JMenuBar menuBar;
	private JMenu menuFichier;
	private JMenu menuAide;
	private JMenu menuOption;
	private JMenuItem menuQuitter;
	private JMenuItem menuPreferences;
	private JMenuItem menuAPropos;
	private final static String[] attributsConfig = {"address", "port"};
	private Configuration conf;
	private RequetesClient reqClient;

	/**
	 * Constructeur
	 */
	public JFAuthentification() {
		// On initialise le titre, la position etc.
		setProperties();
		getContentPane().setLayout(new FlowLayout());

		// On ajoute les différents composants dans la JFrame
		setPicture(FlowLayout.CENTER);
		setLabelAndField(FlowLayout.CENTER);
		setButton(FlowLayout.LEFT);
		setEnter();
		conf = new Configuration("configClient.properties", attributsConfig);
		setVisible(true);
	}

	/**
	 * Configuration des propriétés de la JFrame
	 */
	private void setProperties() {
		// Configuration de la JFrame
		setTitle(TITRE);
		setLocation(ABSCISSE, ORDONNEE);
		setSize(LARGEUR, HAUTEUR);
		setResizable(false);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		addMenuBar();

		// Ajout du 1er JPanel pour qu'il y ait un peu d'espace
		// avec le haut de la JFrame
		firstPan = new JPanel(new FlowLayout());
		firstPan.setPreferredSize(new Dimension(LARGEUR, 10));
		add(firstPan);
	}

	/**
	 * Ajoute le menu Fichier, Options, Aide...
	 */
	private void addMenuBar() {
		menuBar = new JMenuBar();
		menuFichier = new JMenu("Fichier");
		menuBar.add(menuFichier);

		menuOption = new JMenu("Options");
		menuBar.add(menuOption);

		menuAide = new JMenu("Aide");
		menuBar.add(menuAide);

		setJMenuBar(menuBar);

		menuQuitter = new JMenuItem("Quitter");
		menuFichier.add(menuQuitter);
		menuQuitter.addActionListener(this);

		menuPreferences = new JMenuItem("Préférences");
		menuOption.add(menuPreferences);
		menuPreferences.addActionListener(this);

		menuAPropos = new JMenuItem("A propos...");
		menuAide.add(menuAPropos);
		menuAPropos.addActionListener(this);
	}

	/**
	 * Permet l'ajout du logo dans la JFrame
	 * @param alignement, la position
	 */
	private void setPicture(int alignement) {

		panImage = new JPanel(new FlowLayout(alignement));
		panImage.setPreferredSize(new Dimension(LARGEUR, 20));

		BufferedImage myPicture;
		try {
			myPicture = ImageIO.read
					(JFAuthentification.class.getResource("pictures/pony.png"));
			JLabel picLabel = new JLabel(new ImageIcon(myPicture));
			add(picLabel);

			add(panImage);
		} catch (IOException e) { // Image non trouvée
			// TODO EventLog ?
			System.err.println("Problème lors du chargement de l'image !");
		}
	}

	/**
	 * Ajoute les labels et textField associés à la JFrame
	 * @param alignement, la position
	 */
	private void setLabelAndField(int alignement) {

		pan = new JPanel(new FlowLayout(alignement));
		pan.setPreferredSize(new Dimension(LARGEUR, 60));

		labelId = new JLabel(ID + "        ");
		labelMdp = new JLabel(MDP + "  ");

		fieldId = new JTextField(10);
		fieldMdp = new JPasswordField(10);

		pan.add(labelId);
		pan.add(fieldId);

		pan.add(labelMdp);
		pan.add(fieldMdp);

		add(pan);
	}

	/**
	 * Ajoute les boutons à la JFrame
	 * @param alignement, la position
	 */
	private void setButton(int alignement) {

		boutonConnexion = new JButton(CNX);
		boutonConnexion.addActionListener(this);
		boutonQuitter = new JButton(QUITTER);
		boutonQuitter.addActionListener(this);
		panBouton = new JPanel(new FlowLayout(alignement));

		panBouton.add(boutonConnexion);
		panBouton.add(boutonQuitter);
		add(panBouton);
	}

	/**
	 * Si on appuie sur Entrée, alors on déclenche le listener
	 * du boutonConnexion
	 */
	public void setEnter() {
		getRootPane().setDefaultButton(boutonConnexion);
	}

	/**
	 * Permet de gérer les actions sur les ActionListeners
	 */
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == boutonConnexion) {
			if (fieldId.getText().trim().length() == 0
					|| fieldMdp.getPassword().length == 0) {
				new JDLoginError("Un ou plusieurs champs sont vides");
				fieldId.setText("");
				fieldMdp.setText("");
				// On remet le focus sur le champ Id
				fieldId.requestFocusInWindow();
			} else {
				Utilisateur user = null;
				// Tout est bien rentré, on créé l'utilisateur
				try {
					int numUser = Integer.parseInt(fieldId.getText());
					user = new Utilisateur
							(numUser, Chiffrement.toMD5(String.valueOf
									(fieldMdp.getPassword())), null, null);

					// TODO : L'envoyer via RMI au serveur
					try {
						reqClient = new RequetesClient();
						try {
							reqClient.envoyerUtilisateur(user);
							// pb !
							// System.out.println(user.getConnexion());
						} catch (java.lang.NullPointerException ex) {
							new JDLoginError("Connexion au serveur"
									+ " impossible !");
						}
					} catch (java.rmi.NotBoundException ex) {
						new JDLoginError("Connexion au serveur impossible !");
					}
					// new RequetesClient().envoyerUtilisateur(user);

					// System.out.println(user.getConnexion());
					// System.out.println(user.getId() + " " + user.getMdp());
					// TODO : Passer le client en paramètre ?

					// dispose();
				} catch (NumberFormatException e) {
					new JDLoginError("L'identifiant doit être un entier !");
					fieldId.setText("");
					fieldMdp.setText("");
					// On remet le focus sur le champ Id
					fieldId.requestFocusInWindow();
				}

			}
		} else if (ev.getSource() == boutonQuitter 
				|| ev.getSource() == menuQuitter) {
			dispose();
		} else if (ev.getSource() == menuPreferences) {
			JDPreferences preferences = new JDPreferences(conf);
		} else if (ev.getSource() == menuAPropos) {
			JDAPropos aPropos = new JDAPropos("Auteurs : Loic Martinez & aboulkacem Hamid ");
		}
	}
}